package br.com.main.client.system.botoes;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import br.com.main.client.ComunServico;
import br.com.main.client.ComunServicoAsync;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.google.gwt.view.client.SingleSelectionModel;

public class MoradoresPresenter {

	private Display display;
	private boolean editando;

	interface Display {

		List<Morador> getList();

		void atualizaTabela();

		TextBox getTbNome();

		TextBox getTbCpf();

		TextBox getTbTel();

		void limparCampos();

		SingleSelectionModel<Morador> getSelectionModel();

		Button getBtEditar();

		void setEnabledCampos(boolean b);

		Label getLbNovoMorador();

		TextBox getTbEmail();

		void addNovoMorador(Morador e);

		TextBox getTbData_nasc();

		TextBox getTbNumero();

		TextBox getTbBloco();

		TextBox getTbAndar();

		Button getBtExcluir();

		Button getBtSalvar();
	}

	public MoradoresPresenter(Display display) {
		this.editando = false;
		this.display = display;
		listarMoradores();
		bind();
	}

	private void bind() {

		display.getBtSalvar().addClickHandler(new ClickHandler() {

			@Override
			public void onClick(ClickEvent arg0) {
				if (editando) {
					getServico().atualizaMorador(display.getTbNome().getText(),
							display.getTbCpf().getText(),
							display.getTbEmail().getText(),
							display.getTbTel().getText(),
							display.getTbData_nasc().getText(),
							display.getTbNumero().getText(),
							display.getTbBloco().getText(),
							display.getTbAndar().getText(),
							new AsyncCallback<String>() {

								@Override
								public void onSuccess(String s) {
									if (s.equals("True")) {
										listarMoradores();
										display.getBtEditar().click();
										Window.alert("Alterado com sucesso!");
									} else {
										Window.alert("Algum campo está fora dos padrões!");
									}
								}

								@Override
								public void onFailure(Throwable arg0) {
									Window.alert("Deu errado!");
								}
							});
				} else {
					getServico().cadastroMorador(display.getTbNome().getText(),
							display.getTbCpf().getText(),
							display.getTbEmail().getText(),
							display.getTbTel().getText(),
							display.getTbData_nasc().getText(),
							display.getTbNumero().getText(),
							display.getTbBloco().getText(),
							display.getTbAndar().getText(),
							new AsyncCallback<String>() {

								@Override
								public void onSuccess(String s) {
									if (s.equals("Cadastrado")) {
										Window.alert("Cadastrado com sucesso!");
									} else {
										Window.alert("Deu errado!");
									}
								}

								@Override
								public void onFailure(Throwable arg0) {

								}
							});
				}
			}
		});

		display.getBtExcluir().addClickHandler(new ClickHandler() {

			@Override
			public void onClick(ClickEvent arg0) {
				getServico().excluirMorador(display.getTbCpf().getText(),
						new AsyncCallback<Void>() {

							@Override
							public void onSuccess(Void arg0) {
								Window.alert("Morador Excluído!");
								listarMoradores();
							}

							@Override
							public void onFailure(Throwable arg0) {
								Window.alert("Deu errado!");
							}
						});
			}
		});

		display.getSelectionModel().addSelectionChangeHandler(new Handler() {

			@Override
			public void onSelectionChange(SelectionChangeEvent arg0) {
				Morador selected = display.getSelectionModel()
						.getSelectedObject();
				if (selected != null) {
					DateTimeFormat format = DateTimeFormat.getFormat("d/MM/y");
					@SuppressWarnings("deprecation")
					String data_nasc = format.format(new Date(selected
							.getData_nasc()));

					display.getBtExcluir().setEnabled(true);
					display.setEnabledCampos(false);
					display.getBtEditar().setText("Editar");
					display.getTbNome().setText(selected.getNome());
					display.getTbCpf().setText(selected.getCpf());
					display.getTbEmail().setText(selected.getEmail());
					display.getTbTel().setText(selected.getTelefone());
					display.getTbData_nasc().setText(data_nasc);
					display.getTbNumero().setText(selected.getNumero());
					display.getTbBloco().setText(selected.getBloco());
					display.getTbAndar().setText(selected.getAndar());
				}
			}
		});

		display.getLbNovoMorador().addClickHandler(new ClickHandler() {

			@Override
			public void onClick(ClickEvent event) {
				display.getBtEditar().setText("Cancelar");
				display.setEnabledCampos(true);
				display.limparCampos();
			}
		});

		display.getBtEditar().addClickHandler(new ClickHandler() {

			@Override
			public void onClick(ClickEvent event) {
				if (display.getBtEditar().getText().equals("Editar")) {
					editando = true;
					display.setEnabledCampos(true);
					display.getTbCpf().setEnabled(false);
					display.getTbNumero().setEnabled(false);
					display.getTbBloco().setEnabled(false);
					display.getTbAndar().setEnabled(false);
					display.getBtEditar().setText("Cancelar");
				} else { // display.getBtEditar().getText().equals("Cancelar")
					editando = false;
					display.setEnabledCampos(false);
					display.getBtEditar().setText("Editar");
				}
			}
		});

	}

	private void listarMoradores() {
		getServico().listarMoradores(new AsyncCallback<ArrayList<Morador>>() {

			@Override
			public void onSuccess(ArrayList<Morador> e) {
				display.getList().clear();
				for (Morador morador : e) {
					display.getList().add(morador);
				}
				display.atualizaTabela();
			}

			@Override
			public void onFailure(Throwable arg0) {
				// TODO Auto-generated method stub

			}
		});
	}

	private ComunServicoAsync getServico() {
		return GWT.create(ComunServico.class);
	}
}